Los principales objetivos de este ejercicio fueron inicializar la MMU, inicializar un Directorio
y Tabla de P\'aginas para cada tarea, crear dos rutinas encargadas de mapear y desmapear p\'aginas
de memoria y construir un mapa de memoria para tareas e intercambiarlo con el del kernel.

\subsubsection{MMU}
Inicializar\_mmu no hace m\'as que limpiar la pantalla (usando la funci\'on $pintar$ de pintar.asm) pintando la arena y el lugar donde se van a mostrar las tareas y los registros al producirse una interrupci\'on. Queda el mapa de la siguiente manera:
\begin{figure}[H]
	\centering
	\includegraphics[scale=0.5]{Images/todoBonito.png}
	\centering
	\label{fig_todoBonito}
\end{figure}

\subsubsection{Directorio y Tabla de P\'agina de Tarea}
Para crear el Directorio y Tabla de P\'aginas para una tarea contamos con el m\'etodo
\texttt{inicializar\_dir\_tarea} implementado en el archivo {\bf mmu.c}.
\\
\hspace*{10pt}
Este determina las direcciones de memoria d\'onde deben guardarse estos directorios y tablas en
funci\'on de la tarea correspondiente, que es pasada c\'omo par\'ametro, y copia el c\'odigo de
la tarea a su posici\'on en la arena, determinada por el archivo {\bf rand.c}.
\\
\hspace*{10pt}
A continuaci\'on hacemos que el indice 0 del Page Directory de las tareas apunte a la Page Table y con valores seteados
Presente, Read/Write y Usuario (0x7). Luego mapeamos la Tabla de P\'aginas haciendo \emph{identity mapping} de los
primeros 2MB de memoria (seteando presente y read/write con 0x3), y mapeamos las direcciones f\'isicas del c\'odigo y la pila de la tarea
en la arena (determinados por el archivo {\bf rand.c}) a las direcciones \texttt{0x3A000} y
\texttt{0x3B000} respectivamente, con los atributos Presente y Read/Write y nivel de Usuario (0x7).
\\
\hspace*{10pt}
Finalmente, terminamos devolviendo la direcci\'on base del Page Directory.

\subsubsection{Mapear y Desmapear P\'aginas}
Para mapear y desmapear p\'aginas contamos con dos m\'etodos \texttt{mapear\_pagina} y
texttt{unmapear\_pagina} en el archivo {\bf mmu.c}.
\\
\hspace*{10pt}
Para mapear una p\'agina, lo primero que hacemos es calcular el puntero a la base de la Tabla de
P\'aginas a partir del directorio. En esta tabla, vamos a poner en el \'indice, indicado por la
direcci\'on virtual proporcionada, el valor de la direcci\'on f\'isica proporcionada en los
\'ultimos 20 bits, asegurandonos que los \'ultimos 3 bytes de la direcci\'on f\'isica sean ceros
y seteando los atributos de Presente y Read/Write y el nivel proporcionado. Para obtener los \'indices de la Page Directory, Page Table y de la p\'agina lo hacemos resolviendo paginaci\'on a partir de la direcci\'on virtual pasada por par\'ametro. Donde los 10 bits m\'as significativos muestran el \'indice de la Page Directory, los 10 bits siguientes son el \'indice del Page Table y los 12 bits menos significativos son el \'indice en la p\'agina.
Para terminar, actualizamos el TLB.
\\
\hspace*{10pt}
El proceso para desmapear una p\'agina es an\'alogo, con la \'unica diferencia que en vez de poner
una direcci\'on f\'isica, ponemos la misma direcci\'on con el objetivo de preservar el \emph{identity
mapping} original y de limpiarle a la p\'agina los bits de presente, read/write y usuario.

\subsubsection{Mapa de memoria para tareas}
Desde el Kernel, llamamos al m\'etodo \texttt{inicializar\_mmu} para inicializar la MMU. Despu\'es de
guardar en {\bf ebx} el {\bf cr3} actual, llamamos a \texttt{inicializar\_dir\_tarea} para inicializar
la tarea 4, seteamos en {\bf cr3} la direcci\'on del directorio de esta tarea, y realizamos la prueba
de imprimir algo con el mapa de memoria cambiado. Una vez terminado, restauramos el mapa de memoria
original guardado en {\bf ebx}.
\\
\hspace*{10pt}
En la captura de pantalla que sigue, mostramos c\'omo se imprime un cuadrado verde en la columna 1 fila 2 de la pantalla con el mapa de memoria cambiado.

\begin{figure}[H]
	\centering
	\includegraphics[scale=0.5]{Images/ej4.png}
	\centering
	\label{fig_ej4}
\end{figure}
